package com.springboot.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.springboot.exception.NameUndefinedException;
import com.springboot.exception.NameUndefinedException_2;

@ControllerAdvice
public class ExceptionHanderController {

	@ExceptionHandler(value = { NameUndefinedException.class })
	// 使用此注解，不能达到自适应效果，即浏览器和其他客户端得到的结果均为json数据
	@ResponseBody
	public Map<String, Object> nameUndefinedException(Exception e) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("errorContent", "名称不匹配");
		map.put("errorClass", e.getClass());
		return map;
	}

	// 可以做到自适应，web 浏览器访问，返回错误页面，其他客户端访问，返回json数据，原因就是：return "forward:/error";
	@ExceptionHandler(value = { NameUndefinedException_2.class })
	public String nameUndefinedException_2(Exception e, HttpServletRequest request) {

		// 设置错误状态码，否则会来到默认的springboot的错误页
		request.setAttribute("javax.servlet.error.status_code", 500);

		// 不能通过ModelAndView和Map将错误数据回显到错误页面，解决方式如下
		ModelAndView model = new ModelAndView();
		model.addObject("errorContent", "名称不匹配，自适应效果");
		model.addObject("errorClass", e.getClass());

		// 定制错误数据的第一种方式
		// request.setAttribute("errorContent", "自定义错误信息......，自适应效果");
		// request.setAttribute("errorClass", e.getClass());

		// 定制错误数据的第二种方式，不使用springboot自动配置的ErrorAttributes的实现类
		// DefaultErrorAttributes，自己指定实现类MyErrorAttributes，同时添加到容器中

		// 转发到error请求
		return "forward:/error";
	}
}

@Controller
class TestController {
	@RequestMapping("name")
	@ResponseBody
	public String testName(String name) {
		if ("kkk".equalsIgnoreCase(name.trim())) {
			throw new NameUndefinedException("名称是kkk");
		}
		if ("aaa".equalsIgnoreCase(name.trim())) {
			throw new NameUndefinedException_2("名称是kkk");
		}
		return "ok";
	}
}
